package com.example.chamberlainserver.Service;

import com.example.chamberlainserver.Entry.UserActionLog;
import com.example.chamberlainserver.Entry.UserLoginLog;
import com.example.chamberlainserver.dto.PageResult;
import com.example.chamberlainserver.dto.UserActionLogQueryDTO;
import com.example.chamberlainserver.dto.UserLoginLogQueryDTO;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 用户日志服务接口
 */
public interface UserLogService {
    
    /**
     * 记录用户登录
     * @param userId 用户ID
     * @param ip 登录IP
     * @param status 登录状态
     * @param message 登录消息
     * @param userAgent 用户代理信息
     */
    void recordUserLogin(int userId, String ip, int status, String message, String userAgent);
    
    /**
     * 记录用户登出
     * @param loginLogId 登录日志ID
     */
    void recordUserLogout(Long loginLogId);
    
    /**
     * 记录用户操作
     * @param userId 用户ID
     * @param username 用户名
     * @param userRole 用户角色
     * @param module 操作模块
     * @param operation 操作类型
     * @param description 操作描述
     * @param method 请求方法
     * @param requestUrl 请求URL
     * @param requestIp 请求IP
     * @param requestParams 请求参数
     * @param status 操作状态
     * @param errorMsg 错误消息
     * @param duration 执行时长
     */
    void recordUserAction(int userId, String username, String userRole, String module, String operation,
                          String description, String method, String requestUrl, String requestIp, 
                          String requestParams, Boolean status, String errorMsg, Long duration);
    
    /**
     * 获取指定时间段内的登录统计数据
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 登录统计数据
     */
    Map<String, Object> getLoginStats(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取指定时间段内的操作分布数据
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 操作分布数据
     */
    List<Map<String, Object>> getOperationDistribution(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取指定时间段内的每日登录次数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 每日登录次数
     */
    List<Map<String, Object>> getDailyLoginCounts(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 分页查询操作日志
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    PageResult<UserActionLog> pageActionLogs(UserActionLogQueryDTO queryDTO);
    
    /**
     * 获取模块分布
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 模块分布数据
     */
    List<Map<String, Object>> getModuleDistribution(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 分页查询登录日志
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    PageResult<UserLoginLog> pageLoginLogs(UserLoginLogQueryDTO queryDTO);
}